package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.CatalogoDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdTipoTarjetaPersona;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmStockAlmacenCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNCatalogoDetalle;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author Edwin Farfan
 */
@Repository("catalogoDao")
@SuppressWarnings("unchecked")
public class CatalogoDaoImpl extends GenericDaoHibernate<ClpmCatalogo, Long> implements CatalogoDao {

	public CatalogoDaoImpl() {
		super(ClpmCatalogo.class);
	}
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public List<ClpmCatalogo> obtenerListaCatalogos(){

		Criteria criteria = DetachedCriteria.forClass(ClpmCatalogo.class).getExecutableCriteria(getSessionFactory().getCurrentSession());
				criteria.setMaxResults(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
				criteria.add(Restrictions.eq("stCatalogo", Boolean.TRUE));
				criteria.addOrder(Order.desc("id"));
		
				
        return (List<ClpmCatalogo>) criteria.list();
	}
	
	public List<ClpmCatalogo> obtenerCatalogos(){

		StringBuffer query= new StringBuffer();
		query.append(" select  ");
		query.append(" 	c.id  as id, ");
		query.append(" 	c.de_catalogo as deCatalogo ");
		query.append(" from clpm_catalogo c ");
		query.append(" where c.st_catalogo='Y' order by c.da_inicio_vigencia  ");
		
		System.out.println("catalogos "+query.toString());
		return findListOfBeans(query.toString(), null, ClpmCatalogo.class);
	}
	
	
	
	public List<ClpmCatalogo> obtenerListaCatalogosVigente(){

		StringBuffer query= new StringBuffer();
		query.append(" select  ");
		query.append(" 	c.id  as id, ");
		query.append(" 	c.de_catalogo as deCatalogo, ");
		query.append(" 	to_char(c.da_inicio_vigencia,'dd/MM/yyyy') as inicioVigencia, ");
		query.append("  to_char(c.da_fin_canje,'dd/MM/yyyy') as  finCanje ");		
		query.append(" from clpm_catalogo c ");
		query.append(" where c.st_catalogo='Y' ");
		query.append("  and (c.da_inicio_vigencia<=sysdate and c.da_fin_canje>=sysdate) or "); 
		query.append("  c.da_inicio_vigencia>=sysdate or c.da_fin_canje>=sysdate order by c.da_inicio_vigencia  ");
		
		
		return findListOfBeans(query.toString(), null, ClpmCatalogo.class);
	}
	
	public ClpmCatalogo obtenerCatalogo(Long id){
		
		ClpmCatalogo catalogo = getHibernateTemplate().get(ClpmCatalogo.class, id);

		StringBuffer query= new StringBuffer();
		query.append(" select catalogo.id as idPremioCatalogo, ");
		query.append(" catalogo.co_premio as idArticulo, ");
		query.append(" articulo.co_codigo_articulo as coArticulo,  ");
		query.append(" articulo.de_articulo as deArticulo,  ");
		query.append(" catalogo.co_codigo_premio as codigoPremio, ");
		query.append(" decode(catalogo.va_canjes_limite,'0','--',catalogo.va_canjes_limite) as canjesLimites, ");
		query.append(" catalogo.va_puntos_requeridos as puntos, ");
		query.append(" catalogo.va_monto_requerido as dinero, ");
		query.append(" catalogo.va_stock_catalogo_espejo as vaStockCatalogoEspejo, ");
		query.append(" catalogo.va_stock_catalogo as vaStockCatalogo, ");
		query.append(" decode(catalogo.co_premio_instantaneo, null,'--',catalogo.co_premio_instantaneo) as coPremioInstantaneo, ");
		query.append(" decode(catalogo.va_tiempo_max_espera, null,'--',catalogo.va_tiempo_max_espera)   as vaTiempoMaxEspera, ");
		query.append(" decode(catalogo.nu_canjes_max_venta , null,'--',catalogo.nu_canjes_max_venta)    as nuCanjesMaxVenta, ");
		query.append(" decode(catalogo.va_consumo_min_venta , null,'--',catalogo.va_consumo_min_venta)  as vaConsumoMinVenta, ");
		query.append(" decode(catalogo.nu_dias_vencimiento , null,'--',catalogo.nu_dias_vencimiento)    as nuDiasVencimiento ");
		query.append(" from clpr_premio_catalogo catalogo  ");
		query.append(" left join clpd_articulo articulo on catalogo.co_premio= articulo.id ");
		query.append(" where co_catalogo="+id);
		query.append(" and st_premio_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" order by catalogo.id asc ");
		//System.out.println("catalogos"+query.toString());
		catalogo.setCatalogoDetalle(findListOfBeans(query.toString(), null, BNCatalogoDetalle.class));
		return catalogo;
	}
	
	public int guardarCatalogo(ClpmCatalogo catalogo) throws Exception{
		
		if(catalogo.getId() == null){
			catalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			catalogo.setDaFechaCreacion(Calendar.getInstance());
		}
		else{
			catalogo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			catalogo.setDaFechaModificacion(Calendar.getInstance());
		}
		
			ClpdTipoTarjetaPersona tarjeta= getHibernateTemplate().get(ClpdTipoTarjetaPersona.class, catalogo.getClpdTipoTarjetaPersona().getId());
			if (tarjeta !=null)
			catalogo.setClpdTipoTarjetaPersona(tarjeta);
			catalogo.setDaInicioVigencia(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, catalogo.getInicioVigencia()));
			catalogo.setDaFinCanje(CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, catalogo.getFinCanje()));
			catalogo.setStCatalogo(Boolean.TRUE);
			getHibernateTemplate().saveOrUpdate(catalogo);
			return 1;
	}
	
	public int guardarTodoCatalogo(ClpmCatalogo catalogo, BNCatalogoDetalle listaArticulo, 
			ClpdArticulo articulo, ClpbAlmacen almacen) throws Exception{
		
		if(listaArticulo.getIdPremioCatalogo()==null){
			
			//Guardar Premio Catalogo

		ClprPremioCatalogo premioCatalogo=guardarPremioCatalogo(articulo,listaArticulo,almacen,catalogo);

			ClprPremioCatalogo premiCatalogo = guardarPremioCatalogo(articulo,listaArticulo,almacen,catalogo);			

			getHibernateTemplate().saveOrUpdate(premiCatalogo);
			
			if(articulo.isStNoManejaStock() && almacen != null){		
				
				//Guardar el Stock Almacen Catalogo
				ClpmStockAlmacenCatalogo stockAlmacenCatalogo=
					guardarStockAlmacenCatalogo(articulo,almacen,catalogo,premiCatalogo);
				getHibernateTemplate().saveOrUpdate(stockAlmacenCatalogo);
				
				//Guardar la transaccion del articulo
				ClpmTransaccionArticulo transaccionArticulo=guardarTransaccionArticulo(articulo,listaArticulo,almacen,catalogo,premiCatalogo);
				getHibernateTemplate().saveOrUpdate(transaccionArticulo);
				
				actualizarStockArticulo(articulo, new BigDecimal(listaArticulo.getCanjesLimites()),true);
			}
		}
		return 1;
	}
	
	public ClpdArticulo obtenerArticulo(BNCatalogoDetalle detalle){
		return getHibernateTemplate().get(ClpdArticulo.class, detalle.getIdArticulo());
	}
	 
	public ClpmStockAlmacenCatalogo guardarStockAlmacenCatalogo(ClpdArticulo articulo,
			ClpbAlmacen almacen,ClpmCatalogo catalogo,ClprPremioCatalogo premioCatalogo){
		
		ClpmStockAlmacenCatalogo stockAlmacenCatalogo=obtenerStockAlmacenCatalgo(catalogo,premioCatalogo);
		
			stockAlmacenCatalogo.setClpdArticulo(articulo);
			stockAlmacenCatalogo.setClpbAlmacen(almacen);
			stockAlmacenCatalogo.setClpmCatalogo(catalogo);
			stockAlmacenCatalogo.setVaCantidad(premioCatalogo.getVaCanjesLimite());
			stockAlmacenCatalogo.setStStockAlmacenCatalogo(Boolean.TRUE);
			stockAlmacenCatalogo.setClprPremioCatalogo(premioCatalogo);
			
		
			if(stockAlmacenCatalogo.getId() == null){
				stockAlmacenCatalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				stockAlmacenCatalogo.setDaFechaCreacion(Calendar.getInstance());
				
				//editar la canje 
				stockAlmacenCatalogo.setVaStockCatalogo(premioCatalogo.getVaCanjesLimite());
				stockAlmacenCatalogo.setVaStockCatalogoEspejo(premioCatalogo.getVaCanjesLimite());
			}
			else{
				stockAlmacenCatalogo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
				stockAlmacenCatalogo.setDaFechaModificacion(Calendar.getInstance());
				
				BigDecimal valorStock= stockAlmacenCatalogo.getVaStockCatalogo().min(premioCatalogo.getVaCanjesLimite());
				
				//sumar la cantidad de los canjes
				stockAlmacenCatalogo.setVaStockCatalogo(stockAlmacenCatalogo.getVaStockCatalogo().add(valorStock));
				stockAlmacenCatalogo.setVaStockCatalogoEspejo(stockAlmacenCatalogo.getVaStockCatalogo().add(valorStock));
			}
			return stockAlmacenCatalogo;
	}
	
	public ClprPremioCatalogo guardarPremioCatalogo(ClpdArticulo articulo,BNCatalogoDetalle listaArticulo,
			ClpbAlmacen almacen,ClpmCatalogo catalogo){
		
		ClprPremioCatalogo premioCatalogo = new ClprPremioCatalogo();
		

		int codpremiomax=0;
		if(codigoPremioRepetido(listaArticulo.getCodigoPremio().trim())>0){
			codpremiomax=codPremioMax(catalogo.getId().toString());
			codpremiomax++;
		
			if((codpremiomax+"").length()==1){
				codpremiomax=Integer.parseInt("0"+(codpremiomax+""));
			
			}
			listaArticulo.getCodigoPremio().substring(0,12);
			listaArticulo.setCodigoPremio(listaArticulo.getCodigoPremio().substring(0,12)+codpremiomax);
			
		}
		if(listaArticulo.getCoPremioInstantaneo().equalsIgnoreCase("--")){
			premioCatalogo.setCoPremioInstantaneo(null);
		}else{
			premioCatalogo.setCoPremioInstantaneo(new BigDecimal(listaArticulo.getCoPremioInstantaneo().trim()));

		}
		premioCatalogo.setClpdArticulo(articulo);
		premioCatalogo.setClpmCatalogo(catalogo);
		premioCatalogo.setCoCodigoPremio(listaArticulo.getCodigoPremio().trim());
		premioCatalogo.setVaCanjesLimite(new BigDecimal(listaArticulo.getCanjesLimites().trim()));
		premioCatalogo.setVaCanjesLimiteEspejo(new BigDecimal(listaArticulo.getCanjesLimites().trim()));
		premioCatalogo.setVaPuntosRequeridos(new BigDecimal(listaArticulo.getPuntos().trim()));
		premioCatalogo.setVaMontoRequerido(new BigDecimal(listaArticulo.getDinero().trim()));
		premioCatalogo.setStPremioCatalogo(Boolean.TRUE);
		
		if( listaArticulo.getVaTiempoMaxEspera()==null || listaArticulo.getVaTiempoMaxEspera().length()==0){
			premioCatalogo.setVaTiempoMaxEspera(null);
		}else{
			premioCatalogo.setVaTiempoMaxEspera(new BigDecimal (listaArticulo.getVaTiempoMaxEspera().trim()));
		}
	
		if( listaArticulo.getNuCanjesMaxVenta()==null  || listaArticulo.getNuCanjesMaxVenta().length()==0){
			premioCatalogo.setNuCanjesMaxVenta(null);
		}else{
			premioCatalogo.setNuCanjesMaxVenta(new BigDecimal(listaArticulo.getNuCanjesMaxVenta().trim()));
		}
		
		if( listaArticulo.getVaConsumoMinVenta()==null ||  listaArticulo.getVaConsumoMinVenta().length()==0){
			premioCatalogo.setVaConsumoMinVenta(null);
		}else{
			premioCatalogo.setVaConsumoMinVenta(new BigDecimal(listaArticulo.getVaConsumoMinVenta().trim()));
		}
		
		if( listaArticulo.getNuDiasVencimiento()==null || listaArticulo.getNuDiasVencimiento().length()==0){
			premioCatalogo.setNuDiasVencimiento(null);
		}else{
			premioCatalogo.setNuDiasVencimiento(new BigDecimal(listaArticulo.getNuDiasVencimiento().trim()));
		}
	
		if(articulo.isStNoManejaStock()){
			premioCatalogo.setVaStockCatalogo(new BigDecimal(listaArticulo.getCanjesLimites().trim()));
			premioCatalogo.setVaStockCatalogoEspejo(new BigDecimal(listaArticulo.getCanjesLimites().trim()));
		}
		
		if(listaArticulo.getIdPremioCatalogo() != null){
			premioCatalogo.setId(listaArticulo.getIdPremioCatalogo());
		}
		
		if(premioCatalogo.getId() ==null){
			premioCatalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			premioCatalogo.setDaFechaCreacion(Calendar.getInstance());
		}
		else{
			premioCatalogo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			premioCatalogo.setDaFechaModificacion(Calendar.getInstance());
		}   
		
		return premioCatalogo;
	}
	public ClpmTransaccionArticulo guardarTransaccionArticulo(ClpdArticulo articulo,BNCatalogoDetalle listaArticulo,
							ClpbAlmacen almacen,ClpmCatalogo catalogo,ClprPremioCatalogo premioCatalogo ){
		
		ClpmTransaccionArticulo transaccionArticulo= new ClpmTransaccionArticulo();
		transaccionArticulo.setClpdArticulo(articulo);
		transaccionArticulo.setCoCodigoArticulo(listaArticulo.getCoArticulo().trim());
		transaccionArticulo.setStIndicadorTipoMovimiento(CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK);
		transaccionArticulo.setVaCantidad(new BigDecimal(listaArticulo.getCanjesLimites().trim()));
		transaccionArticulo.setClpbAlmacen(almacen);
		transaccionArticulo.setClpmCatalogo(catalogo);
		transaccionArticulo.setClprPremio(premioCatalogo);
		transaccionArticulo.setCoCodigoPremio(listaArticulo.getCodigoPremio().trim());
		
		if(transaccionArticulo.getId() == null){
			transaccionArticulo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			transaccionArticulo.setDaFechaCreacion(Calendar.getInstance());
		}
		else{
			transaccionArticulo.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
			transaccionArticulo.setDaFechaModificacion(Calendar.getInstance());
		}
		return transaccionArticulo;
	}
	
	public List<ClpmCatalogo> busquedaCatalogo(String descripcion, String codigo, 
			String tipoTarjeta, String fechaInicio, String fechaFin, String estado){

		StringBuffer query = new StringBuffer();
		query.append(" select catalogo.id as id, ");
		query.append(" catalogo.de_catalogo as deCatalogo, ");
		query.append(" catalogo.co_codigo_catalogo as coCodigoCatalogo, ");
		query.append(" tarjeta.de_tipo_tarjeta_persona as deTipoTarjetaPersona, ");
		query.append(" to_char(catalogo.da_inicio_vigencia,'"+CLPConstantes.DATE_PATTERN+"') as inicioVigencia, ");
		query.append(" to_char(catalogo.da_fin_canje,'"+CLPConstantes.DATE_PATTERN+"') as finCanje ");
		query.append(" from clpm_catalogo catalogo ");
		query.append(" left join clpd_tipo_tarjeta_persona tarjeta on catalogo.co_tipo_tarjeta_persona= tarjeta.id ");
		
		if(StringUtils.isNotBlank(estado))
		query.append(" where st_catalogo='"+estado+"' ");
		
		if(StringUtils.isNotBlank(tipoTarjeta) && !tipoTarjeta.equals("-1"))
			query.append(" and co_tipo_tarjeta_persona ="+tipoTarjeta+"");
		
		if(StringUtils.isNotBlank(codigo))
			query.append(" and upper(co_codigo_catalogo) like upper('%"+codigo+"%') ");
		
		if(StringUtils.isNotBlank(descripcion))
			query.append(" and upper(de_catalogo) like upper('%"+descripcion+"%') ");
		
		if(StringUtils.isNotBlank(fechaInicio))
			query.append(" and da_inicio_vigencia >= to_date('"+fechaInicio+"', '"+CLPConstantes.DATE_PATTERN+"') ");
		
		if(StringUtils.isNotBlank(fechaFin))
			query.append(" and da_fin_canje <= to_date('"+fechaFin+"', '"+CLPConstantes.DATE_PATTERN+"') ");
		
		 
		List<ClpmCatalogo> listaClpmCatalogo= findListOfBeans(query.toString(), null, ClpmCatalogo.class);
		
        return listaClpmCatalogo;
	}
	
	public int existeCatalogoRangoFecha(String fechaInicio, String fechaFin, Long catalogoID){
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select count(*) from clpm_catalogo");
		query.append(" where st_catalogo = ? ");
		params.add(CLPConstantes.ST_VERDADERO);
		
		if(catalogoID != null){
			query.append(" and id != ? ");
			params.add(catalogoID);
		}
		
		query.append(" and (");
		
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");		
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");		
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"')    >=  to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"')    >  to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <  to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <=  to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_canje, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" )");

		//System.out.println("catalogos/existentes"+query.toString());
		return jdbcTemplate.queryForInt(query.toString(), params.toArray());
	}
	
	public int eliminarCatalogo(Long id){
		ClpmCatalogo catalogo= obtenerCatalogo(id);
		
		if(vigenciaCatalogo(catalogo)){
			return 2;
		}
		if(dependenciasCatalogo(catalogo)){
			return 1;
		}
		inactivarCatalogo(catalogo);
		catalogo.setStCatalogo(Boolean.FALSE);
		getHibernateTemplate().update(catalogo);
		return 0;
	}
	
	/**
	 * @return method dependenciasCatalogo devuelve true si es
	 * que tiene dependencias, de caso contrario 
	 * devuelve false.
	 */
	public boolean dependenciasCatalogo(ClpmCatalogo catalogo){
		
		StringBuffer query= new StringBuffer();
		query.append(" select count(*) from clpm_transaccion_articulo ");
		query.append(" where st_indicador_tipo_movimiento is not null ");
		query.append(" and st_indicador_tipo_movimiento <>'"+CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK+"' ");
		query.append(" and st_indicador_tipo_movimiento <>'"+CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK+"'");
		query.append(" and co_catalogo="+catalogo.getId());
		
		Integer contadorDependiente= jdbcTemplate.queryForInt(query.toString());
		
		if (contadorDependiente >0){
			return true;
		}
		return false;
	}

	/**
	 * @author Frank
	 * description: todos los catalogos activos vigentes
	 * */
	public List<BNCatalogo> obtenerTodoCatalogos(boolean itemDefault) {

		StringBuffer query = new StringBuffer();
        query.append(" select ");
        query.append("   id, de_catalogo as deCatalogo ");
        query.append(" from clpm_catalogo ");
        query.append(" where st_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
        query.append(" and (to_date(to_char(da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy')  " +
                "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')  " +
                "and to_date(to_char(da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy')  >= " +
                "to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ) ");
        query.append(" order by de_catalogo asc ");
		
		List listFinal = new ArrayList();
		List list = findListOfBeans(query.toString(), null, BNCatalogo.class);
		
		if(itemDefault){			
			BNCatalogo bncatalogo = new BNCatalogo();
			bncatalogo.setId(new Long("-1"));
			bncatalogo.setDeCatalogo("----");
			listFinal.add(bncatalogo);
		}
		
		listFinal.addAll(list);
		return listFinal;
	}
		
	public boolean eliminarPremiosCatalogo(ClpmCatalogo catalogo){
		
		//cambiar pa lo de baja
		
		StringBuffer idPremios= new StringBuffer();
		if(catalogo.getCatalogoDetalle().size() > 0){
			
			for (int i = 0; i < catalogo.getCatalogoDetalle().size(); i++) {
				if(catalogo.getCatalogoDetalle().get(i).getIdPremioCatalogo()!=null){
					idPremios.append(catalogo.getCatalogoDetalle().get(i).getIdPremioCatalogo().toString());
					if((i < (catalogo.getCatalogoDetalle().size()-1)) && (catalogo.getCatalogoDetalle().get(i).getIdPremioCatalogo()!=null)){
						idPremios.append(",");	
					}
				}
			}
			
			if(StringUtils.isNotBlank(idPremios.toString())){
				StringBuffer queryNoPremios=new StringBuffer();
				queryNoPremios.append(" select id from clpr_premio_catalogo ");
				queryNoPremios.append(" where st_premio_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
				queryNoPremios.append(" and co_catalogo="+catalogo.getId());
				queryNoPremios.append(" and (id not in ("+StringUtils.removeEnd(idPremios.toString(), ",")+") and co_premio is not null) ");
				
				List<Map<String,Object>> idPremiosEliminados = jdbcTemplate.queryForList(queryNoPremios.toString());
				StringBuffer idPremiosBorrados= new StringBuffer();
				
				for (Iterator it = idPremiosEliminados.iterator(); it.hasNext();) {
					LinkedHashMap object = (LinkedHashMap) it.next();
					idPremiosBorrados.append(String.valueOf(object.get("id")));
					if(it.hasNext() && (StringUtils.isNotBlank(object.get("id").toString()))){
						idPremiosBorrados.append(",");	
					}
				}
				if(StringUtils.isNotBlank(idPremiosBorrados.toString())){
					
					StringBuffer queryUpdatePremio= new StringBuffer();
					queryUpdatePremio.append(" update clpr_premio_catalogo set st_premio_catalogo='"+CLPConstantes.ST_FALSO+"' ");
					queryUpdatePremio.append(", co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"'");
					queryUpdatePremio.append(", da_fecha_modificacion= sysdate ");
					queryUpdatePremio.append(" where  co_catalogo="+catalogo.getId());
					queryUpdatePremio.append(" and id  in ("+StringUtils.removeEnd(idPremiosBorrados.toString(),",")+") ");
					jdbcTemplate.update(queryUpdatePremio.toString());

					String [] premiosTx= idPremiosBorrados.toString().split(",");
					String [] desasignacionArtCatalogo= new String[premiosTx.length];
					
					//para la desasignacion de articulos que no manejan stock
					for (int j = 0; j < premiosTx.length; j++) {

					ClprPremioCatalogo premio = getHibernateTemplate().get(ClprPremioCatalogo.class,new Long(premiosTx[j]));
					ClpmStockAlmacenCatalogo stockAlmacenCatalogo=obtenerStockAlmacenCatalgo(catalogo,premio);

						if(premio != null && stockAlmacenCatalogo.getId() != null){
							if (premio.getId().toString().equals(premiosTx[j])) {
								desasignacionArtCatalogo[j]  = " insert into clpm_transaccion_articulo ";
								desasignacionArtCatalogo[j] += " (id, co_articulo, co_codigo_articulo, st_indicador_tipo_movimiento, ";
								desasignacionArtCatalogo[j] += " va_cantidad, co_almacen, co_catalogo, co_premio, ";
								desasignacionArtCatalogo[j] += " co_codigo_premio, co_usuario_creador, da_fecha_creacion) ";
								desasignacionArtCatalogo[j] += " values (seq_transaccion_articulo.nextval, ";
								desasignacionArtCatalogo[j] += premio.getClpdArticulo().getId()+ ", ";
								desasignacionArtCatalogo[j] += "'"+premio.getClpdArticulo().getCoCodigoArticulo()+ "', ";
								desasignacionArtCatalogo[j] += "'"+ CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK+ "', ";
								desasignacionArtCatalogo[j] += stockAlmacenCatalogo.getVaCantidad().negate()+", ";//cantidad seteada a NEGATIVO
								desasignacionArtCatalogo[j] += obtenerIdAlmacenVirtual()+ ", ";
								desasignacionArtCatalogo[j] += catalogo.getId()	+ ", ";
								desasignacionArtCatalogo[j] += premio.getId() + ", ";
								desasignacionArtCatalogo[j] += "'"+ premio.getCoCodigoPremio()+ "', ";
								desasignacionArtCatalogo[j] += "'" + getUsuarioLogueado().getUsername() + "', ";
								desasignacionArtCatalogo[j] += "sysdate)";
		
								log.info("desasignacion de articulos: " + desasignacionArtCatalogo[j]);
								jdbcTemplate.update(desasignacionArtCatalogo[j]);
								}
						}
		
						actualizarStockArticulo(premio.getClpdArticulo(), premio.getVaCanjesLimite(), false);
					}
					actualizarStockCatalogo(catalogo, idPremiosBorrados.toString());
					
				return true;
				}
			}
		}
		return false;
	}
	
	public void setEliminacionPremioCatalogo(ClpmCatalogo catalogo){
		
		for (BNCatalogoDetalle premio: catalogo.getCatalogoDetalle()) {
			StringBuffer query= new StringBuffer ();	
			query.append("  select count(*) from clpm_transaccion_articulo ");
			query.append(" where co_premio="+premio.getIdPremioCatalogo());
			query.append(" and co_catalogo="+catalogo.getId());
			query.append(" and st_indicador_tipo_movimiento !='"+CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK+"'");
			
			int flat= jdbcTemplate.queryForInt(query.toString());
			
			if (flat>0){	//el premio no se podra eliminar
				premio.setStEliminar(Boolean.FALSE);
			}else{
				premio.setStEliminar(Boolean.TRUE); }
		}
	}
	

	public ClpmStockAlmacenCatalogo obtenerStockAlmacenCatalgo(ClpmCatalogo catalogo, ClprPremioCatalogo premio){
		
		StringBuffer sql= new StringBuffer();
		sql.append(" select id from clpm_stock_almacen_catalogo ");
		sql.append(" where st_stock_almacen_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
		sql.append(" and co_catalogo="+catalogo.getId());
		sql.append(" and co_premio="+premio.getId());
		
		List<Map<String, Object>> lista= jdbcTemplate.queryForList(sql.toString());
		List<ClpmStockAlmacenCatalogo> listStocks = new ArrayList<ClpmStockAlmacenCatalogo>();
		
		for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
			
			LinkedHashMap object = (LinkedHashMap) iterator.next();
			String idStock= String.valueOf(object.get("id"));
			if(StringUtils.isNotBlank(idStock)){
				ClpmStockAlmacenCatalogo stock= getHibernateTemplate().get(ClpmStockAlmacenCatalogo.class,new Long(idStock));
				listStocks.add(stock);
			}
		}
		ClpmStockAlmacenCatalogo stockAlmacenCatalogo =listStocks.isEmpty()? new ClpmStockAlmacenCatalogo():listStocks.get(0); 
		return stockAlmacenCatalogo;
	}

	public boolean vigenciaCatalogo(ClpmCatalogo catalogo){
		
		//este metodo retorna true si es que el catalogo se encuentra vigente 
		StringBuffer query=  new StringBuffer();
		query.append(" select count(*) from clpm_catalogo ");
		query.append(" where st_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" and (to_date(to_char(da_inicio_vigencia, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        "<= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy') ");
		query.append(" and to_date(to_char(da_fin_canje, 'dd/MM/yyyy'),'dd/MM/yyyy') " +
        ">= to_date(to_char(sysdate, 'dd/MM/yyyy'),'dd/MM/yyyy')) ");
		
		query.append(" and id="+catalogo.getId());
		
		int row = jdbcTemplate.queryForInt(query.toString());
		if (row > 0 ){
			return true;
		}
		
		return false;
	}

	//metodo que desactiva un catalogo.
	public void inactivarCatalogo(ClpmCatalogo catalogo){
		
		catalogo.setStCatalogo(Boolean.FALSE);
		
		List<ClpmTransaccionArticulo> listaTransancion= new ArrayList<ClpmTransaccionArticulo>();
		List <ClpmTransaccionArticulo> listaTransancionManejaStock= new ArrayList<ClpmTransaccionArticulo>();
		List <ClprPremioCatalogo> listaPremio = new ArrayList<ClprPremioCatalogo>();
		
		String idPremiosBorrados= new String();
		for (BNCatalogoDetalle detalle: catalogo.getCatalogoDetalle()) {
			
			ClpdArticulo articulo 		= null;
			ClprPremioCatalogo premio 	= null;
			ClpmTransaccionArticulo transaccion	= new ClpmTransaccionArticulo();
			Long idAlmacenVirtual= obtenerIdAlmacenVirtual();

			articulo =obtenerArticulo(detalle);
			premio = getHibernateTemplate().get(ClprPremioCatalogo.class, detalle.getIdPremioCatalogo());
			ClpmStockAlmacenCatalogo stockAlmacenCatalogo= obtenerStockAlmacenCatalgo(catalogo, premio);
			
			idPremiosBorrados += premio.getId()+ ",";  //recogo todos los premios para actualizar su stock
			
			if (stockAlmacenCatalogo.getId()!=null){
			
				actualizarStockArticulo(articulo,premio.getVaCanjesLimite(), false);
					
				transaccion.setClpmCatalogo(catalogo);
				transaccion.setClpdArticulo(articulo);
				transaccion.setClprPremio(premio);
				transaccion.setCoCodigoPremio(detalle.getCodigoPremio());
				transaccion.setClpbAlmacen(getHibernateTemplate().get(ClpbAlmacen.class, idAlmacenVirtual));
				transaccion.setCoCodigoArticulo(detalle.getCoArticulo());
				
				//TODO: editar la cantidad de la transaccion a su valor en negativo
				transaccion.setVaCantidad(stockAlmacenCatalogo.getVaCantidad().negate());
				transaccion.setDaFechaCreacion(Calendar.getInstance());
				transaccion.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				
				if(articulo.isStNoManejaStock()){
					transaccion.setStIndicadorTipoMovimiento(CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK);
				}
				
				if(articulo.isStManejaStockAlmPrincipal() || articulo.isStManejaStockPuntoCanje()){
					transaccion.setStIndicadorTipoMovimiento(CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_MANEJA_STOCK);
					transaccion.setClpbAlmacen(stockAlmacenCatalogo.getClpbAlmacen());
					
					ClpmTransaccionArticulo transancionManejaStock= new ClpmTransaccionArticulo();
					transancionManejaStock.setClpbAlmacen(stockAlmacenCatalogo.getClpbAlmacen());
					transancionManejaStock.setClpdArticulo(articulo);
					transancionManejaStock.setClpmCatalogo(catalogo);
					transancionManejaStock.setClprPremio(premio);
					transancionManejaStock.setCoCodigoArticulo(detalle.getCoArticulo());
					transancionManejaStock.setCoCodigoPremio(detalle.getCodigoPremio());
					transancionManejaStock.setStIndicadorTipoMovimiento(CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_MANEJA_STOCK);
					transancionManejaStock.setVaCantidad(stockAlmacenCatalogo.getVaCantidad());
					transancionManejaStock.setDaFechaCreacion(Calendar.getInstance());
					transancionManejaStock.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					listaTransancionManejaStock.add(transancionManejaStock);
				}
				premio.setStPremioCatalogo(Boolean.FALSE);
				
				listaTransancion.add(transaccion);
				listaPremio.add(premio);
			}
		}
		
		if(listaPremio.isEmpty()){
			getHibernateTemplate().saveOrUpdateAll(listaPremio);
		}
		if (!listaTransancion.isEmpty()){
			getHibernateTemplate().saveOrUpdateAll(listaTransancion);
			actualizarStockCatalogo(catalogo, StringUtils.removeEnd(idPremiosBorrados.toString(),","));
		}
		if(!listaTransancionManejaStock.isEmpty()){
			getHibernateTemplate().saveOrUpdateAll(listaTransancionManejaStock);
		}
		
		getHibernateTemplate().flush();
	}
	
	public Long obtenerIdAlmacenVirtual(){

		StringBuffer idAlmacen =new StringBuffer();
		idAlmacen.append(" select id from clpb_almacen ");
		idAlmacen.append(" where st_almacen='Y' ");
		idAlmacen.append(" and st_es_almacen_virtual='Y' ");
		idAlmacen.append(" and st_es_almacen_principal='N' ");
		idAlmacen.append(" and st_es_punto_canje='N' ");
		
		return jdbcTemplate.queryForLong(idAlmacen.toString());
	}
	public ClpbAlmacen getClpbAlmacen(){
		
		Long id= obtenerIdAlmacenVirtual();
		
		if (id !=null){
			return getHibernateTemplate().get(ClpbAlmacen.class, id);
		}
		return null;
	}
	
	public void actualizarStockCatalogo(ClpmCatalogo catalogo, String idPremiosBorrados){
		StringBuffer queryUpdateStock= new StringBuffer();
		queryUpdateStock.append(" update clpm_stock_almacen_catalogo  ");
		queryUpdateStock.append(" set st_stock_almacen_catalogo='"+CLPConstantes.ST_FALSO+"' ");
		queryUpdateStock.append(", va_stock_catalogo="+BigDecimal.ZERO);
		queryUpdateStock.append(", va_stock_catalogo_espejo="+BigDecimal.ZERO);
		queryUpdateStock.append(", va_cantidad="+BigDecimal.ZERO);
		queryUpdateStock.append(", co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"'");
		queryUpdateStock.append(", da_fecha_modificacion=sysdate ");
		queryUpdateStock.append(" where st_stock_almacen_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
		
		queryUpdateStock.append(" and co_catalogo = "+catalogo.getId()+" ");
		queryUpdateStock.append(" and (co_premio  in ("+StringUtils.removeEnd(idPremiosBorrados.toString(),",")+") and co_premio is not null) ");
		jdbcTemplate.update(queryUpdateStock.toString());
	}
	
	
	public void actualizarStockArticulo(ClpdArticulo articulo, BigDecimal canjeLimite, boolean flat){
		BigDecimal stockActual= new BigDecimal(0);
		
		if(articulo.isStNoManejaStock()){
			
			if (flat)
				stockActual= articulo.getVaStockActual().add(canjeLimite);
			else 
				stockActual= articulo.getVaStockActual().subtract(canjeLimite);
			
			articulo.setVaStockActual(stockActual);
			getHibernateTemplate().saveOrUpdate(articulo);
		}
		
	}
	
	public ClpdTipoTarjetaPersona  obtenerTipoTarjetaPersona(Long id){
		return getHibernateTemplate().get(ClpdTipoTarjetaPersona.class, id);
	}

	public int existeCatalogoDescription(String deCatalogo, Long catalogoID) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select count(*) from clpm_catalogo");
		query.append(" where st_catalogo='"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and trim(upper(de_catalogo)) like trim(upper('").append(deCatalogo).append("'))");
		
		if(catalogoID != null){
			query.append(" and id != ").append(catalogoID);
		}
		
		return jdbcTemplate.queryForInt(query.toString());
	}

	public int existeCatalogoCodigoCatalog(String coCodigoCatalogo, Long catalogoID) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select count(*) from clpm_catalogo");
		query.append(" where st_catalogo='"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and trim(upper(co_codigo_catalogo)) like trim(upper('").append(coCodigoCatalogo).append("'))");
		
		if(catalogoID != null){
			query.append(" and id != ").append(catalogoID);
		}
		
		return jdbcTemplate.queryForInt(query.toString());
	}


	public int darbajaPremio(Long id) {
	
		StringBuffer query= new StringBuffer();
		
		query.append(" update clpr_premio_catalogo ");
		query.append(" set 	st_premio_catalogo='N', ");
		query.append(" 	 	co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
		query.append(" 	 	da_fecha_modificacion  = sysdate");
		query.append(" where id=?");
		

		return jdbcTemplate.update(query.toString(), id);
	}
	
	public BNCatalogoDetalle obtenerCatalogoxPremio(Long id, Long idpremio){
		
		List<BNCatalogoDetalle> lista= null;
		BNCatalogoDetalle bean=new BNCatalogoDetalle();
		StringBuffer query= new StringBuffer();
		
		query.append(" select catalogo.id as idPremioCatalogo, ");
		query.append(" catalogo.co_premio as idArticulo, ");
		query.append(" articulo.co_codigo_articulo as coArticulo,  ");
		query.append(" articulo.de_articulo as deArticulo,  ");
		query.append(" catalogo.co_codigo_premio as codigoPremio, ");
		query.append(" catalogo.va_puntos_requeridos as puntos, ");
		query.append(" catalogo.va_monto_requerido as dinero, ");
		query.append(" catalogo.co_catalogo as idCatalogo, ");
		query.append(" catalogo.va_canjes_limite as canjesLimites, ");
		query.append(" catalogo.va_canjes_limite_espejo as vaCanjesLimiteEspejo, ");
		query.append(" catalogo.va_stock_catalogo_espejo as vaStockCatalogoEspejo, ");
		query.append(" catalogo.va_stock_catalogo as vaStockCatalogo, ");
		query.append(" decode(catalogo.co_premio_instantaneo, null,' ',catalogo.co_premio_instantaneo) as coPremioInstantaneo, ");
		query.append(" decode(catalogo.va_tiempo_max_espera, null,' ',catalogo.va_tiempo_max_espera)   as vaTiempoMaxEspera, ");
		query.append(" decode(catalogo.nu_canjes_max_venta , null,' ',catalogo.nu_canjes_max_venta)    as nuCanjesMaxVenta, ");
		query.append(" decode(catalogo.va_consumo_min_venta , null,' ',catalogo.va_consumo_min_venta)  as vaConsumoMinVenta, ");
		query.append(" decode(catalogo.nu_dias_vencimiento , null,' ',catalogo.nu_dias_vencimiento)    as nuDiasVencimiento ");
		query.append(" from clpr_premio_catalogo catalogo ");
		query.append(" left join clpd_articulo articulo on catalogo.co_premio= articulo.id ");
		query.append(" where co_catalogo="+id);
		query.append(" and catalogo.id="+idpremio);
		query.append(" and st_premio_catalogo='"+CLPConstantes.ST_VERDADERO+"' ");
		query.append(" order by catalogo.id asc ");

		lista=findListOfBeans(query.toString(), null, BNCatalogoDetalle.class);
		if(!lista.isEmpty()){
		
			bean.setIdPremioCatalogo(lista.get(0).getIdPremioCatalogo());
			bean.setIdArticulo(lista.get(0).getIdArticulo());
			bean.setCoArticulo(lista.get(0).getCoArticulo());
			bean.setDeArticulo(lista.get(0).getDeArticulo());
			bean.setCodigoPremio(lista.get(0).getCodigoPremio());
			bean.setIdCatalogo(lista.get(0).getIdCatalogo());
			bean.setCanjesLimites(lista.get(0).getCanjesLimites());
			bean.setVaCanjesLimiteEspejo(lista.get(0).getVaCanjesLimiteEspejo());
			bean.setVaStockCatalogoEspejo(lista.get(0).getVaStockCatalogoEspejo());
			bean.setVaStockCatalogo(lista.get(0).getVaStockCatalogo());
			bean.setCodigoPremio(lista.get(0).getCoPremioInstantaneo());
			
		}
	
		return bean;
		
	}
	//-pepe
	
	
	public List<Map<String, Object>>  obtenerStockAlmacen(Long idCatalogo,Long idPremio){

		List<ClpmStockAlmacenCatalogo> lista=null;
		StringBuffer query=new StringBuffer();
		List<Map<String,Object>> mapper= null;
		
		query.append(" select  ");
		query.append(" sta.id as id, ");
		query.append(" sta.va_cantidad as vaCantidad, ");
		query.append(" sta.co_articulo as coArticulo, ");
		query.append(" sta.co_catalogo as coCatalogo, ");
		query.append(" sta.co_almacen as coAlmacen, ");
		query.append(" sta.co_premio as coPremioCatalogo, ");
		query.append(" sta.va_comprometido as vaComprometido, ");
		query.append(" sta.va_stock_catalogo as vaStockCatalogo, ");
		query.append(" sta.va_stock_catalogo_espejo as vaStockCatalogoEspejo, ");
		query.append(" sta.st_stock_almacen_catalogo as stStockAlmacenCatalogo ");
		query.append(" from clpm_stock_almacen_catalogo sta ");
		query.append(" where sta.co_catalogo=? AND sta.co_premio=?");
		
		mapper=jdbcTemplate.queryForList(query.toString(), idCatalogo,idPremio);
	
		return mapper;
		
	}
	
	
	
	
	public String generarDocumentoDarBajaPremioCatalogo(Long idcatalogo,Long idpremio, Long  idarticulo, int resultado){
		
		int clpbdocumento=0;

		String seqQuery = "select SEQ_DOCUMENTO_MOV_ARTICULO.nextVal from dual";
        Long id = jdbcTemplate.queryForLong(seqQuery);

		StringBuffer query=new StringBuffer();

		query.append(" insert into clpb_documento_mov_articulo");
		query.append(" (id,co_usuario_creador,da_fecha_creacion,da_fecha_documento,de_documento,st_almacen_principal,st_direccion, ");
		query.append("	st_documento_mov_articulo,st_indicador_tipo_documento,st_punto_canje,co_catalogo,co_premio,co_articulo)");
		query.append(" values("+id+",'"+getUsuarioLogueado().getUsername()+"',sysdate,sysdate,'"+CLPConstantes.ST_DOCUMENTO_BAJA+"','N','N',");
		query.append("  '"+CLPConstantes.ST_VERDADERO+"','"+CLPConstantes.ST_DOCUMENTO_BAJA+"','"+CLPConstantes.ST_FALSO+"',"+idcatalogo+","+idpremio+","+idarticulo+")");
		//System.out.println("insertar documento"+query.toString());
		clpbdocumento=jdbcTemplate.update(query.toString());
		if(clpbdocumento>0){

			return id.toString();
		}
			return "Error";
	}
	


	public String documentoDetalleDarBajaPremios(String id,Long idocumento,String coalmacenorigen, 
		   String vaStockActual, String idpremio, String idcatalogo,String cantidad,String idarticulo){
		BNCatalogoDetalle bean=new BNCatalogoDetalle();
		BigDecimal stockCatalogo= new BigDecimal(0);
		BigDecimal stockCatalogoEspejo= new BigDecimal(0);
		BigDecimal cantidadAlmancen = new BigDecimal(0);
		
		StringBuffer query= new StringBuffer();
		StringBuffer query1= new StringBuffer();
		StringBuffer query2= new StringBuffer();
		StringBuffer query3= new StringBuffer();
		StringBuffer query4= new StringBuffer();
		StringBuffer query5= new StringBuffer();
		StringBuffer query6= new StringBuffer();
		StringBuffer query7= new StringBuffer();
		StringBuffer query8= new StringBuffer();
		
		if(Integer.parseInt(cantidad)>0){
			
		query.append(" insert into clpd_documento_mov_articulo");
		query.append(" (id,co_usuario_creador,da_fecha_creacion,st_documento_mov_articulo,va_cantidad,co_documento_mov_articulo, ");
		query.append("	co_articulo,co_premio, co_catalogo_origen,co_almacen_origen,co_almacen_destino )");
		query.append(" values(seq_documento_mov_articulo_d.nextVal,'"+getUsuarioLogueado().getUsername()+"',sysdate,'Y',"+cantidad+","+idocumento+", ");
		query.append(" "+idarticulo+","+idpremio+", "+idcatalogo+", "+coalmacenorigen+","+coalmacenorigen+")");
		//System.out.println("insertar documento detalle"+query.toString());
		int valor=jdbcTemplate.update(query.toString());
		if(valor>0){
//Generando la Transaccion//
			//insert de resta al catalogo//
			BigDecimal cant= new BigDecimal(cantidad);
			query1.append(" insert into clpm_transaccion_articulo");
			query1.append(" (id,co_usuario_creador,da_fecha_creacion,st_indicador_tipo_movimiento,va_cantidad, co_documento_mov_articulo, ");
			query1.append("	co_articulo,co_premio, co_catalogo,co_almacen)");
			query1.append(" values(seq_documento_mov_articulo_d.nextVal,'"+getUsuarioLogueado().getUsername()+"',sysdate,'"+CLPConstantes.DAR_BAJA_PREMIOS_CATALOGO+"',"+cant.negate()+","+idocumento+", ");
			query1.append(" "+idarticulo+","+idpremio+", "+idcatalogo+","+coalmacenorigen+")");
			//System.out.println("query1-Insert/catalogorestar/transaccion"+query1.toString());
			jdbcTemplate.update(query1.toString());
			
			//insert agregar al almacen
			query2.append(" insert into clpm_transaccion_articulo");
			query2.append(" (id,co_usuario_creador,da_fecha_creacion,st_indicador_tipo_movimiento,va_cantidad,co_documento_mov_articulo, ");
			query2.append("	co_articulo,co_almacen)");
			query2.append(" values(seq_documento_mov_articulo_d.nextVal,'"+getUsuarioLogueado().getUsername()+"',sysdate,'"+CLPConstantes.DAR_BAJA_PREMIOS_CATALOGO+"',"+cant+","+idocumento+", ");
			query2.append(" "+idarticulo+","+coalmacenorigen+") ");
			//System.out.println("query2/Insert/almacen/transaccion"+query2.toString());
			jdbcTemplate.update(query2.toString());
//fin de la transaccion			
		
			//--actualizar stocks--//
			
			
			//Long vaStockCatalogo= Long.parseLong(vaStockActual)-Long.parseLong(cantidad);
			int hayalmacen=obteneralmacenes(coalmacenorigen, idarticulo);
			if(hayalmacen==1){
				
				query3.append(" update clpm_stock_almacen_catalogo");
				query3.append(" set ");
				//query3.append("	va_cantidad=0,va_stock_catalogo_espejo=0,va_stock_catalogo=").append(vaStockCatalogo);
				query3.append("	va_cantidad=0,va_stock_catalogo_espejo=0,va_stock_catalogo=0 ");
				query3.append(" ,co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"',da_fecha_modificacion=sysdate ");
				query3.append("  where id="+id+"");
				//System.out.println("query3-Update/stock"+query3.toString());
				jdbcTemplate.update(query3.toString());
				
				
				// modifico el almacen
				
				
				
				bean=obtenerValoresAlmacen(coalmacenorigen, idarticulo);
				stockCatalogo=new BigDecimal(bean.getVaStockCatalogo());
				stockCatalogo=stockCatalogo.add(new BigDecimal(cantidad));
				
				stockCatalogoEspejo=new BigDecimal(bean.getVaStockCatalogoEspejo());
				stockCatalogoEspejo=stockCatalogoEspejo.add(new BigDecimal(cantidad));	
				
				cantidadAlmancen=new BigDecimal(bean.getVaCantidad());
				cantidadAlmancen= cantidadAlmancen.add(new BigDecimal(cantidad));
				
				query8.append(" update clpm_stock_almacen_catalogo");
				query8.append(" set ");
				query8.append("	va_cantidad=  "+cantidadAlmancen+" ");
				query8.append(" ,va_stock_catalogo= "+stockCatalogo+" ");
				query8.append("	,va_stock_catalogo_espejo="+stockCatalogoEspejo+" ");
				query8.append(" ,co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"',da_fecha_modificacion=sysdate ");
				query8.append("  where co_almacen="+coalmacenorigen+" and co_articulo="+idarticulo+" and co_catalogo is null");
				//System.out.println("query8-Update/stock"+query8.toString());
				jdbcTemplate.update(query8.toString());
				
			}else if(hayalmacen==0){
				 
				query4.append(" insert into clpm_stock_almacen_catalogo");
				query4.append(" (id,co_usuario_creador,da_fecha_creacion,va_cantidad,st_stock_almacen_catalogo, ");
				query4.append("	co_articulo,co_almacen)");
				query4.append(" values(seq_stock_almacen_catalogo.nextVal,'"+getUsuarioLogueado().getUsername()+"',sysdate,"+cant+",'Y', ");
				query4.append(" "+idarticulo+","+coalmacenorigen+") ");
				//System.out.println("query4-insert/stock"+query4.toString());
				jdbcTemplate.update(query4.toString());
				
				query5.append(" update clpm_stock_almacen_catalogo");
				query5.append(" set ");
				query5.append("	va_cantidad=0,va_stock_catalogo_espejo=0,va_stock_catalogo=0 ");
				query5.append(" ,co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"',da_fecha_modificacion=sysdate ");
				query5.append("  where id="+id+"");
				//System.out.println("query5-Update/stock"+query5.toString());
				jdbcTemplate.update(query5.toString());
				
				
			}
			
		
			}
				return cantidad;
		
			}else if(Integer.parseInt(cantidad)<=0){
				
				query6.append(" insert into clpm_stock_almacen_catalogo");
				query6.append(" (id,co_usuario_creador,da_fecha_creacion,va_cantidad,st_stock_almacen_catalogo,");
				query6.append("	co_articulo,co_almacen)");
				query6.append(" values(seq_stock_almacen_catalogo.nextVal,'"+getUsuarioLogueado().getUsername()+"',sysdate,"+cantidad+",'Y', ");
				query6.append(" "+idarticulo+","+coalmacenorigen+") ");
				//System.out.println("query6/Insert/stock"+query6.toString());
				jdbcTemplate.update(query6.toString());
				
				query7.append(" update clpm_stock_almacen_catalogo");
				query7.append(" set ");
				query7.append("	va_cantidad=0,va_stock_catalogo_espejo=0,va_stock_catalogo=0 ");
				query7.append(" ,co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"',da_fecha_modificacion=sysdate ");
				query7.append("  where id="+id+"");
				//System.out.println("query7-Update/stock"+query7.toString());
				jdbcTemplate.update(query7.toString());
			
			
				return "0";
			}
		
				return null;
		
	}
	
	
	public int obteneralmacenes(String almacen, String articulo){
		
	
		StringBuffer query= new StringBuffer();
		query.append(" select count(id)");
		query.append("  		from clpm_stock_almacen_catalogo  ");
		query.append(" where co_almacen="+almacen+" and co_articulo="+articulo+" and co_premio is null and co_catalogo is null ");
		//System.out.println("Obtener almacenes:"+query.toString());
		
		return jdbcTemplate.queryForInt(query.toString());
		
	}
	public int actualizarPremiosDarBaja(Long idCatalogo, Long ipremio, BigDecimal stockcatalogo, BigDecimal stockcatalogoespejo ){
		StringBuffer query =new StringBuffer();
		query.append(" update clpr_premio_catalogo");
		query.append(" 	set ");
		query.append("	va_stock_catalogo=").append(stockcatalogo);
		query.append(" ,co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"',da_fecha_modificacion=sysdate, ");
		query.append("	va_stock_catalogo_espejo=").append(stockcatalogoespejo);
		query.append("  where id="+ipremio+" and co_catalogo="+idCatalogo+"");
		//System.out.println("Dar de Baja "+query.toString());
		return jdbcTemplate.update(query.toString());
		
	}

	public List<ClpmCatalogo> obtenerCatalogoVigentes(String fechaInicio, String fechafin){
		
		StringBuffer query= new StringBuffer();
		query.append(" Select ");
		query.append(" 	c.id  as id, ");
		query.append(" 	c.de_catalogo as deCatalogo, ");
		query.append(" 	to_char(c.da_inicio_vigencia,'dd/MM/yyyy') as inicioVigencia, ");
		query.append("  to_char(c.da_fin_canje,'dd/MM/yyyy') as  finCanje ");	
		query.append("  from clpm_catalogo c where ");
		
		if(fechaInicio.equals("sysdate") && fechafin.equals("sysdate")){
		query.append(" 	c.da_inicio_vigencia <=sysdate ");
		query.append(" and c.da_fin_canje >= sysdate ");

		}else{
			query.append(" 	c.da_inicio_vigencia >= to_date('"+fechaInicio+"', '"+CLPConstantes.DATE_PATTERN+"') ");
			query.append(" and c.da_fin_canje >= to_date('"+fechafin+"', '"+CLPConstantes.DATE_PATTERN+"') ");

		}
				
		
		
		query.append(" and c.st_catalogo='Y' ");
		
		
		return findListOfBeans(query.toString(),null ,ClpmCatalogo.class);

	}
	
	
	public String obteneridPremioInstantaneo(String idscatalogo){
		
		int maximo=0;
		
		StringBuffer query= new StringBuffer();
		query.append(" Select ");
		query.append(" 	max(co_premio_instantaneo) from clpr_premio_catalogo ");
		query.append(" 	where ");
		query.append(" co_catalogo IN (").append(idscatalogo).append(") ");	
		query.append(" 	and co_premio_instantaneo is not null  ");
		
		maximo=jdbcTemplate.queryForInt(query.toString());
		 
		
		return maximo+"";

	}

	public int codigoPremioRepetido(String codipremio){
		
	
		StringBuffer query= new StringBuffer();
		query.append(" Select count(co_codigo_premio) from clpr_premio_catalogo where co_codigo_premio='"+codipremio+"' ");
		
		return jdbcTemplate.queryForInt(query.toString());
	}
	
	public int  codPremioMax(String codcatalogo){
		
		StringBuffer query= new StringBuffer();
		query.append(" Select MAX(substr(co_codigo_premio, 13, 14)) from clpr_premio_catalogo where co_catalogo="+codcatalogo+"  ");
		
		return jdbcTemplate.queryForInt(query.toString());
		
		
	}

	public int sonCatalogosParalelos(String fechaInicio, String fechaFin){
		int conta=0;
		StringBuffer query= new StringBuffer();
		query.append(" select count(id) from clpm_catalogo ");
		query.append(" where");
		query.append("  da_inicio_vigencia = to_date('"+fechaInicio+"', '"+CLPConstantes.DATE_PATTERN+"') ");
		query.append("	 and da_fin_canje = to_date('"+fechaFin+"', '"+CLPConstantes.DATE_PATTERN+"') ");
		conta=jdbcTemplate.queryForInt(query.toString());
	    return conta;
	
	}
	
	public BNCatalogoDetalle obtenerValoresAlmacen(String codAlmacen, String codArticulo){
		
		StringBuffer query= new StringBuffer();
		BNCatalogoDetalle bean= new BNCatalogoDetalle();
		
		query.append(" Select");
		
		query.append(" id AS idPremioCatalogo, ");
		query.append(" decode(va_stock_catalogo,null,'0',va_stock_catalogo)   AS vaStockCatalogo, ");
		query.append(" decode(va_stock_catalogo_espejo,null,'0',va_stock_catalogo_espejo) AS	vaStockCatalogoEspejo, ");
		query.append(" decode(va_cantidad,null,'0',va_cantidad) AS vaCantidad ");	
		query.append(" from clpm_stock_almacen_catalogo ");
		query.append(" where   co_articulo="+codArticulo+" and co_almacen="+codAlmacen+" and co_catalogo is null  ");
		
		
		List<Map<String,Object>> lista=jdbcTemplate.queryForList(query.toString());
		Map<String, Object> map=null;
		if(!lista.isEmpty()){
			map = (HashMap<String, Object>)lista.get(0);
			bean.setVaCantidad(map.get("vaCantidad").toString());
			bean.setVaStockCatalogo(map.get("vaStockCatalogo").toString());
			bean.setVaStockCatalogoEspejo(map.get("vaStockCatalogoEspejo").toString());
			
		}
		
		return bean;
	}
	
	
	public List<BNCatalogoDetalle> obtenerPremiosCatalogos(String idCatalogo, String idArticulo){
		
		StringBuffer query= new StringBuffer();
		List<BNCatalogoDetalle> listaPremios=null;
		BNCatalogoDetalle bean=null;
		
		query.append(" Select");	
		query.append(" 		catalogo.id as idPremioCatalogo, ");
		query.append(" 		catalogo.co_premio as idArticulo, ");
		query.append(" 		articulo.de_articulo as deArticulo,  ");
		query.append(" 		catalogo.co_codigo_premio as codigoPremio, ");
		query.append(" 		catalogo.co_catalogo as idCatalogo, ");
		query.append(" 		catalogo.va_puntos_requeridos as puntos, ");
		query.append(" 		catalogo.va_monto_requerido as dinero, ");
		query.append(" 		decode(catalogo.co_premio_instantaneo, null,'--',catalogo.co_premio_instantaneo) as coPremioInstantaneo, ");
		query.append(" 		decode(catalogo.va_tiempo_max_espera, null,'--',catalogo.va_tiempo_max_espera)   as vaTiempoMaxEspera, ");
		query.append(" 		decode(catalogo.nu_canjes_max_venta , null,'--',catalogo.nu_canjes_max_venta)    as nuCanjesMaxVenta, ");
		query.append(" 		decode(catalogo.va_consumo_min_venta , null,'--',catalogo.va_consumo_min_venta)  as vaConsumoMinVenta, ");
		query.append(" 		decode(catalogo.nu_dias_vencimiento , null,'--',catalogo.nu_dias_vencimiento)    as nuDiasVencimiento ");
		query.append(" from clpr_premio_catalogo catalogo  ");
		query.append(" 			inner join clpd_articulo articulo on catalogo.co_premio= articulo.id ");	
		query.append(" where catalogo.co_premio=").append(idArticulo);
		query.append(" and catalogo.st_premio_catalogo=").append("'").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and		1 = 1 ");

		if(StringUtils.isNotBlank(idCatalogo)){
			query.append(" and catalogo.co_catalogo=").append(idCatalogo);
			
		}
	
		List<Map<String,Object>> lista=jdbcTemplate.queryForList(query.toString());
		Map<String, Object> map=null;
		if(!lista.isEmpty()){
			listaPremios= new ArrayList<BNCatalogoDetalle>();
			for(int i=0; i<lista.size() ;i++ ){
				map = (HashMap<String, Object>)lista.get(i);
				bean=new BNCatalogoDetalle();
				bean.setIdPremioCatalogo(new Long(map.get("idPremioCatalogo").toString()));
				bean.setIdArticulo(new Long(map.get("idArticulo").toString()));
				bean.setDeArticulo(map.get("deArticulo").toString());
				bean.setCodigoPremio(map.get("codigoPremio").toString());
				bean.setIdCatalogo(new Long(map.get("idCatalogo").toString()));
				bean.setPuntos(map.get("puntos").toString());
				bean.setDinero(map.get("dinero").toString());
				bean.setCoPremioInstantaneo(map.get("coPremioInstantaneo").toString());
				bean.setVaTiempoMaxEspera(map.get("vaTiempoMaxEspera").toString());
				bean.setNuCanjesMaxVenta(map.get("nuCanjesMaxVenta").toString());
				bean.setVaConsumoMinVenta(map.get("vaConsumoMinVenta").toString());
				bean.setNuDiasVencimiento(map.get("nuDiasVencimiento").toString());
				
				listaPremios.add(bean);
			}
		

			
		}

		return listaPremios;
		
	}
	
	
	public int validarCodInstRepetido(String fechaInicio, String fechaFin, int idcodPreInstantaneo){
		
		
		StringBuffer query= new StringBuffer();
		
		query.append(" select count(decode(cpa.id, null,0,cpa.id)) ");
		query.append(" 	from clpm_catalogo ca ");
		query.append(" 		join clpr_premio_catalogo cpa ");
		query.append(" 		on ca.id=cpa.co_catalogo ");
		query.append(" where ");
		query.append("  ca.da_inicio_vigencia = to_date('"+fechaInicio+"', '"+CLPConstantes.DATE_PATTERN+"')  ");
		query.append("  and ca.da_fin_canje   = to_date('"+fechaFin+"', '"+CLPConstantes.DATE_PATTERN+"') ");
		query.append("  and cpa.co_premio_instantaneo=").append(idcodPreInstantaneo);
		
			
		return jdbcTemplate.queryForInt(query.toString());
		
	}

	@Override
	public int cantidadPremiosCatalogo(String idCatalogo) {
	
		int cantidad;
		StringBuffer query= new StringBuffer();
		
		query.append(" Select");	
		query.append(" count(*) as cantidad");
		query.append(" from clpr_premio_catalogo catalogo  ");
		query.append(" 	inner join clpd_articulo articulo on catalogo.co_premio= articulo.id ");	
		query.append(" where catalogo.st_premio_catalogo=").append("'").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and catalogo.co_catalogo=").append(idCatalogo);
		
		cantidad=jdbcTemplate.queryForInt(query.toString());
		return cantidad;
	}
}
